package com.utopa.canal.client.handler;

import com.alibaba.fastjson2.JSON;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.utopa.canal.client.util.CanalUtils;

import java.util.*;

/**
 * 模式数据转换类
 *
 * @author authorZhao
 * @date 2020年04月20日
 */
public class DefaultRowDataHandler implements RowDataHandler {
    /**
     * 默认转化方式，目标对象必须和数据库字段一一对应，目标对象必须是驼峰命名规则
     *
     * @param rowData   canal 同步的数据，对应行
     * @param clazz     需要转化的 pojo 对象
     * @param eventType 操作类型
     * @param <T>
     * @return
     */
    @Override
    public <T> T changeType(CanalEntry.RowData rowData, Class<T> clazz, CanalEntry.EventType eventType) {
        Map<String, String> afterColumnMap = new HashMap<>();
        List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
        List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
        if (CanalEntry.EventType.DELETE == eventType) {
            // 删除操作：获取操作前的数据
            afterColumnsList = beforeColumnsList;
        }
        afterColumnsList.stream().forEach(afterColumn -> {
            String columnName = afterColumn.getName();
            String columnNameCamel = CanalUtils.underline2camel(columnName);
            afterColumnMap.put(columnNameCamel, afterColumn.getValue());
        });
        String sourceJson = JSON.toJSONString(afterColumnMap);
        T object = JSON.parseObject(sourceJson, clazz);
        return object;
    }
}
